package pacote;

public class RoteadorDeBorda extends Host {
	
	public RoteadorDeBorda(Subrede subrede){
		super(subrede);
	}
	
	@Override
	public boolean N_Activate_Request(){
		if(!inicializaNiveisDeRede(true)) return false;
		if(!inicializaNiveisDeEnlace()) return false;
		if(!inicializaNiveisFisicos()) return false;
		
		return true;
	}
	
	@Override
	public int N_Data_Receive(Protocolo protocolo, Ip ip_sender, int dados_do_datagrama_recebido, int datagrama_data_max_size){
		Datagrama datagrama;
		if((datagrama = enlace.getDatagrama()) != null){
			if(subrede.pertenceASubrede(datagrama.getIp_destino())){
				enviaDatagrama(datagrama);
				printa("Roteador de borda Ip: " + ip_host.getIp() + ", Repassando Datagrama para Host, Ip origem: " + datagrama.getIp_origem().getIp() +", Ip Destino: " + datagrama.getIp_destino().getIp() );
			} else {
				enviaDatagramaParaRoteadorCentral(datagrama);
				printa("Roteador de borda Ip: " + ip_host.getIp() + ", Repassando Datagrama para Roteador Central, Ip origem: " + datagrama.getIp_origem().getIp() +", Ip Destino: " + datagrama.getIp_destino().getIp() );
			}
			return datagrama.getTamanho_dos_dados();
		}
		return -1;
	}
	
	@Override
	public void enviaDatagrama(Datagrama datagrama) {
		enlace.sendDatagrama(datagrama, end_mac, descobreMac(datagrama.getIp_destino()));
	}

	public void enviaDatagramaParaRoteadorCentral(Datagrama datagrama) {
		enlace.sendDatagrama(datagrama, end_mac, new Mac("58-ee-4f-c8-3f-38"));
	}
	
	@Override
	public void run() {
		while(true) {
			if (N_Data_Indication(null)){
				N_Data_Receive(null, null, 0, 0);
			}
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
